#define ADD(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    add s0, t0, t1 \

#define ADDU(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    addu s0, t0, t1

#define ORI(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    ori s0, t0, v1

#define LUI(v0) \
    lui t0, v0

#define LW(data, base_addr, offset, offset_align) \
    li t1, data; \
    li t0, base_addr; \
    li t2, offset; \
    li t4, offset_align; \
    sw t1, offset_align(t0); \
    lw s0, offset(t0)

    #define SW(data, base_addr, offset, offset_align) \
    li t1, data; \
    li t0, base_addr; \
    li t2, offset; \
    li t4, offset_align; \
    sw t1, offset(t0); \
    lw s0, offset_align(t0)

    #define ANDI(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    andi s0, t0, v1

    #define OR(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    or s0, t0, t1

#define XOR(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    xor s0, t0, t1

#define ADDIU(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    addiu s0, t0, v1

#define BEQ(v0, v1, back_flag, front_flag) \
    li t4, back_flag; \
    li t5, front_flag; \
    li s0, 0x0; \
    li s2, 0x0; \
    b 2000f; \
    nop; \
1000:; \
    li s0, back_flag; \
    beq t1, t0, 3000f; \
    nop; \
    b 4000f; \
    nop; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
2000:; \
    li t0, v0; \
    li t1, v1; \
    beq t0, t1, 1000b; \
    nop; \
    b 4000f; \
    nop; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
3000:; \
    li s2, front_flag; \
4000:; \
    nop

#define LB(data, base_addr, offset, offset_align) \
    li t1, data; \
    li t0, base_addr; \
    li t2, offset; \
    li t4, offset_align; \
    sw t1, offset_align(t0); \
    lb s0, offset(t0)

    #define SB(data_init, data, base_addr, offset, offset_align) \
    li t1, data; \
    li t0, base_addr; \
    li t2, offset; \
    li t4, offset_align; \
    li t5, data_init; \
    sw t5, offset_align(t0); \
    sb t1, offset(t0); \
    lw s0, offset_align(t0)

#define SLL(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    sll s0, t0, v1

    #define SLLV(v0, v1) \
    li t0, v0; \
    li t1, v1; \
    sllv s0, t0, t1

#define BLEZ(v0, back_flag, front_flag) \
    li t4, back_flag; \
    li t5, front_flag; \
    li s0, 0x0; \
    li s2, 0x0; \
    b 2000f; \
    nop; \
1000:; \
    li s0, back_flag; \
    blez t0, 3000f; \
    nop; \
    b 4000f; \
    nop; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
2000:; \
    li t0, v0; \
    blez t0, 1000b; \
    nop; \
    b 4000f; \
    nop; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
3000:; \
    li s2, front_flag; \
4000:; \
    nop
    
#define BNE(v0, v1, back_flag, front_flag) \
    li t4, back_flag; \
    li t5, front_flag; \
    li s0, 0x0; \
    li s2, 0x0; \
    b 2000f; \
    nop; \
1000:; \
    li s0, back_flag; \
    bne t1, t0, 3000f; \
    nop; \
    b 4000f; \
    nop; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
2000:; \
    li t0, v0; \
    li t1, v1; \
    bne t0, t1, 1000b; \
    nop; \
    b 4000f; \
    nop; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
    addu zero, zero, zero; \
3000:; \
    li s2, front_flag; \
4000:; \
    nop